﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Sysgeprava.Entities;
using Sysgeprava.BL;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace Sysgeprava.Web.Controllers
{
    public class BovinoController : Controller
    {
        [Dependency]
        public IBovinoBL bovinoBL { get; set; }

        [Dependency]
        public ISexoBL sexoBL { get; set; }

        [Dependency]
        public IRazaBL razaBL { get; set; }

        [Dependency]
        public IEtapaBL etapaBL { get; set; }

        [Dependency]
        public IFotoBovinoBL fotoBovinoBL { get; set; }
        //
        // GET: /Bovino/

        public ActionResult Index()
        {
            var bovino = bovinoBL.GetAllFromBovino();
            return View(bovino);
        }

        public ActionResult Create()
        {
            var bovino = new BOVINO();
            var sexo = sexoBL.GetAllFromSexo();
            var raza = razaBL.GetAllFromRaza();
            var etapa = etapaBL.GetAllFromEtapa();

            ViewData["IdSexo"] = new SelectList(sexo, "Id", "Descripcion");
            ViewData["IdRaza"] = new SelectList(raza, "Id", "Descripcion");
            ViewData["IdEtapa"] = new SelectList(etapa, "Id", "Descripcion");

            return View(bovino);
        }

        [HttpPost]
        public ActionResult Create(FormCollection colection, BOVINO _bovino, HttpPostedFileBase image)
        {
            var bovino = new BOVINO();
            var fotoBov = new FOTO_BOVINO();

            try
            {
                //guardand imagen...
                if (image == null)
                {
                    fotoBov.Imagen = null;
                    fotoBov.IdBovino = bovino.Id;
                    fotoBov.Hash = null;
                }
                if (image != null)
                {
                    var TipoImagen = image.ContentType;
                    int length = image.ContentLength;
                    byte[] buffer = new byte[length];
                    image.InputStream.Read(buffer, 0, length);

                    StringBuilder sb = new StringBuilder();
                    /*Obtenemos la encriptacion en md5*/
                    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                    byte[] hash = md5.ComputeHash(buffer);
                    foreach (var item in hash)
                    {
                        sb.Append(item.ToString("x2").ToUpper());
                    }

                    fotoBov.Imagen = buffer;
                    fotoBov.IdBovino = bovino.Id;
                    fotoBov.Hash = sb.ToString();
                }

                if (_bovino.IndComp == null) { bovino.IndComp = false; }
                else { bovino.IndComp = _bovino.IndComp; }
                
                if (_bovino.IndPrimerisa == null) { bovino.IndPrimerisa = false; }
                else { bovino.IndPrimerisa = _bovino.IndPrimerisa; }

                if (bovino.IndComp == false)
                {
                    bovino.FecCompra = _bovino.FecCompra;
                    bovino.NomVendedor = "";
                    bovino.PrecComp = _bovino.PrecComp;
                    bovino.LugComp = "";
                }
                else
                {
                    bovino.FecCompra = _bovino.FecCompra;
                    bovino.NomVendedor = _bovino.NomVendedor.ToUpper();
                    bovino.PrecComp = _bovino.PrecComp;
                    bovino.LugComp = _bovino.LugComp.ToUpper();
                }
                bovino.NroArete = _bovino.NroArete.ToUpper();
                bovino.Nombre = _bovino.Nombre.ToUpper();
                bovino.CantPartos = _bovino.CantPartos;
                bovino.FecNac = _bovino.FecNac;
                bovino.LugNac = _bovino.LugNac.ToUpper();
                bovino.NroRegistro = _bovino.NroRegistro.ToUpper();
                bovino.PesoAct = _bovino.PesoAct;
                //bovino.PesoNac = _bovino.PesoNac;
                bovino.IdEtapa = Int32.Parse(colection["IdEtapa"].ToString());
                bovino.IdSexo = Int32.Parse(colection["IdSexo"].ToString());
                bovino.IdRaza = Int32.Parse(colection["IdRaza"].ToString());
                bovino.FOTO_BOVINO = fotoBov;

                //asignando bovino madre
                if (_bovino.IdBovMadre == 0) { bovino.IdBovMadre = 1; }
                else { bovino.IdBovMadre = _bovino.IdBovMadre; }

                bovinoBL.AddBovino(bovino);

                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
                msg = "Bovino no pudo ser Registrado, favor revise información";
                TempData["AlertMessage"] = msg;
                return RedirectToAction("Create");
            }
        }

        public ActionResult Edit(Int32 id)
        {
            var bovino = bovinoBL.GetAllFromBovinoById(id);
            var sexo = sexoBL.GetAllFromSexo();
            var etapa = etapaBL.GetAllFromEtapa();
            var raza = razaBL.GetAllFromRaza();
            ViewData["IdSexo"] = new SelectList(sexo,"Id","Descripcion",bovino.IdSexo);
            ViewData["IdRaza"] = new SelectList(raza,"Id","Descripcion",bovino.IdRaza);
            ViewData["IdEtapa"] = new SelectList(etapa, "Id", "Descripcion", bovino.IdEtapa);

            return View(bovino);
        }

        [HttpPost]
        public ActionResult Edit(int id, FormCollection colection, BOVINO _bovino, HttpPostedFileBase image)
        {
            var bovino = new BOVINO();
            var fotoBov = new FOTO_BOVINO();

            try
            {
                if (image == null)
                {
                    var foto = fotoBovinoBL.GetFromFotoBovinoByBovinoId(id);

                    fotoBov.Imagen = foto.Imagen;
                    fotoBov.IdBovino = _bovino.Id;
                    fotoBov.Hash = foto.Hash;
                }
                if (image != null)
                {
                    var TipoImagen = image.ContentType;
                    int length = image.ContentLength;
                    byte[] buffer = new byte[length];
                    image.InputStream.Read(buffer, 0, length);

                    StringBuilder sb = new StringBuilder();
                    /*Obtenemos la encriptacion en md5*/
                    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                    byte[] hash = md5.ComputeHash(buffer);
                    foreach (var item in hash)
                    {
                        sb.Append(item.ToString("x2").ToUpper());
                    }

                    fotoBov.Imagen = buffer;
                    fotoBov.IdBovino = _bovino.Id;
                    fotoBov.Hash = sb.ToString();
                }

                if (_bovino.IndComp == null) { bovino.IndComp = false; }
                else { bovino.IndComp = _bovino.IndComp; }

                if (_bovino.IndPrimerisa == null) { bovino.IndPrimerisa = false; }
                else { bovino.IndPrimerisa = _bovino.IndPrimerisa; }

                if (bovino.IndComp == false)
                {
                    bovino.FecCompra = _bovino.FecCompra;
                    bovino.NomVendedor = "";
                    bovino.PrecComp = _bovino.PrecComp;
                    bovino.LugComp = "";
                }
                else
                {
                    bovino.FecCompra = _bovino.FecCompra;
                    bovino.NomVendedor = _bovino.NomVendedor.ToUpper();
                    bovino.PrecComp = _bovino.PrecComp;
                    bovino.LugComp = _bovino.LugComp.ToUpper();
                }
                bovino.NroArete = _bovino.NroArete.ToUpper();
                bovino.Nombre = _bovino.Nombre.ToUpper();
                bovino.CantPartos = _bovino.CantPartos;
                bovino.FecNac = _bovino.FecNac;
                bovino.LugNac = _bovino.LugNac.ToUpper();
                bovino.NroRegistro = _bovino.NroRegistro.ToUpper();
                bovino.PesoAct = _bovino.PesoAct;
                //bovino.PesoNac = _bovino.PesoNac;
                bovino.IdEtapa = Int32.Parse(colection["IdEtapa"].ToString());
                bovino.IdSexo = Int32.Parse(colection["IdSexo"].ToString());
                bovino.IdRaza = Int32.Parse(colection["IdRaza"].ToString());
                bovino.FOTO_BOVINO = fotoBov;
                bovino.Id = _bovino.Id;

                //asignando bovino madre
                if (_bovino.IdBovMadre == 0) { bovino.IdBovMadre = 1; }
                else { bovino.IdBovMadre = _bovino.IdBovMadre; }

                bovinoBL.UpdateBovino(bovino);

                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
                msg = "Bovino no pudo ser Editado, favor revise información";
                TempData["AlertMessage"] = msg;
                return RedirectToAction("Edit");
            }
        }

        public ActionResult Details(Int32 id)
        {
            var bovino = bovinoBL.GetAllFromBovinoById(id);
            var fotoBov = fotoBovinoBL.GetFromFotoBovinoByBovinoId(bovino.Id);

            bovino.FOTO_BOVINO = fotoBov;
            return PartialView(bovino);
        }

        public ActionResult GetAllBovinoByCriterio(string term)
        {
           var result = bovinoBL.GetAllFromBovino()
                .Where(r => (r.NroArete.Contains(term) || r.Nombre.Contains(term.ToUpper()))&&r.IdSexo==2)
                .Take(10)
                .Select(r => new { id = r.Id, nomCompleto = r.NroArete + " - " + r.Nombre + " - " + r.RAZA.Descripcion + " - " + r.SEXO.Descripcion,
                                   label = r.NroArete + " - " + r.Nombre});

           return Json(result, JsonRequestBehavior.AllowGet);
        }

        public ActionResult ValidarArete(string arete, int id = 0)
        {
            var bovino = bovinoBL.GetAllFromBovinoByArete(arete);

            var existe = bovino == null ? false : true;

            var result = new
            {
                existe = existe,
                nomBovino = bovino != null ? bovino.NroArete + " - " + bovino.Nombre : ""
            };

            return Json(result, JsonRequestBehavior.AllowGet);
        }

        public ActionResult GetImagen(Int32 id)
        {
            var foto = fotoBovinoBL.GetFromFotoBovinoByBovinoId(id);

            if (foto.Imagen != null)
            {
                return File(foto.Imagen, "image/jpeg", Server.UrlDecode(foto.Hash));
            }
            else
            {
                var path = Path.Combine("~/Images/bovDefault.png");
                return File(path, "image/jpeg");
            }
        }

        public ActionResult GetFechas(Int32 id, Int32 cod)
        {
            var bovino = bovinoBL.GetAllFromBovinoById(id);

            var existe = bovino == null ? false : true;

            var result = new
            {
                existe = existe,
                fecNac = bovino != null && cod == 1 ? bovino.FecNac.ToShortDateString().ToString() : null,
                fecComp = bovino != null && cod == 2 ? (bovino.FecCompra ?? default(DateTime)).ToShortDateString().ToString() : null
            };
            return Json(result, JsonRequestBehavior.AllowGet);
        }

        public ActionResult GetChecks(Int32 id, Int32 cod)
        {
            var bovino = bovinoBL.GetAllFromBovinoById(id);

            var existe = bovino == null ? false : true;

            var result = new
            {
                existe = existe,
                chkPrim = bovino != null && cod == 1 ? bovino.IndPrimerisa : null,
                chkComp = bovino != null && cod == 2 ? bovino.IndComp : null
            };
            return Json(result, JsonRequestBehavior.AllowGet);
        }

        public ActionResult GetBovinoMadre(Int32 id)
        {
            var bovino = bovinoBL.GetAllFromBovinoById(id);

            var existe = bovino == null ? false : true;

            var result = new
            {
                existe = existe,
                idBovMadre = bovino != null ? Convert.ToString(bovino.IdBovMadre) : "",
                bovMadre = bovino != null ? bovinoBL.GetAllFromBovinoById(bovino.IdBovMadre).NroArete + " - " + bovinoBL.GetAllFromBovinoById(bovino.IdBovMadre).Nombre : ""
            };
            return Json(result, JsonRequestBehavior.AllowGet);
        }

        public ActionResult GetBovinoMadreByCompra(Int32 id)
        {
            var bovino = bovinoBL.GetAllFromBovinoById(id);

            var existe = bovino == null ? false : true;

            var resutl = new
            {
                existe = existe,
                idBovMadre = bovino != null ? Convert.ToString(bovino.IdBovMadre) : "",
                bovMadre = bovino != null ? bovino.NroArete + " - " + bovino.Nombre : ""
            };
            return Json(resutl,JsonRequestBehavior.AllowGet);
        }
    }
}
